package com.lgmshare.component.utils;

import android.content.Context;
import android.content.SharedPreferences;

import java.util.Map;
import java.util.Set;

/**
 * SharedPreferences工具类
 *
 * @author leo
 * @date 2019/12/24
 */
public class SharedPreferencesUtils {

    /**
     * 获取SharedPreferences的两种方式:
     * 1 调用Context对象的getSharedPreferences()方法
     * 2 调用Activity对象的getPreferences()方法
     * 两种方式的区别:
     * 调用Context对象的getSharedPreferences()方法获得的SharedPreferences对象可以被同一应用程序下的其他组件共享.
     * 调用Activity对象的getPreferences()方法获得的SharedPreferences对象只能在该Activity中使用.
     * <p>
     * SharedPreferences的四种操作模式:
     * Context.MODE_PRIVATE
     * Context.MODE_APPEND
     * Context.MODE_WORLD_READABLE
     * Context.MODE_WORLD_WRITEABLE
     * <p>
     * Context.MODE_PRIVATE：为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
     * Context.MODE_APPEND：模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
     * Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件.
     * MODE_WORLD_READABLE：表示当前文件可以被其他应用读取.
     * MODE_WORLD_WRITEABLE：表示当前文件可以被其他应用写入.
     * <p>
     * 数据保存：
     * apply:提交到内存中，不会立即保存到文件中（特殊情况下数据可能会丢失）
     * commit：提交保存到文件中
     */
    private static final String DEFAULT_PREFERENCE_FILE = "app_spcache";
    private final static String JSON_CACHE = "key_json";

    private SharedPreferencesUtils() {
    }

    //------------------默认文件名-------------------------

    public static SharedPreferences getSharedPreferences() {
        return getSharedPreferences(DEFAULT_PREFERENCE_FILE);
    }

    /**
     * @param name preferences文件名
     * @return
     */
    public static SharedPreferences getSharedPreferences(String name) {
        SharedPreferences preferences = UIUtils.getContext().getSharedPreferences(name, Context.MODE_PRIVATE);
        return preferences;
    }

    public static SharedPreferences.Editor getEditor() {
        return getEditor(DEFAULT_PREFERENCE_FILE);
    }

    /**
     * @param name preferences文件名
     * @return
     */
    public static SharedPreferences.Editor getEditor(String name) {
        SharedPreferences.Editor editor = getSharedPreferences(name).edit();
        return editor;
    }

    /**
     * SP中写入String类型value
     *
     * @param key   键
     * @param value 值
     */
    public static void putString(String key, String value) {
        SharedPreferences.Editor editor = getEditor();
        editor.putString(key, value);
        editor.apply();
    }

    /**
     * SP中读取String
     *
     * @param key 键
     * @return 存在返回对应值，不存在返回默认值""
     */
    public static String getString(String key) {
        return getString(key, "");
    }

    /**
     * SP中读取String
     *
     * @param key        键
     * @param defaultVal 默认值
     * @return 存在返回对应值，不存在返回默认值{@code defaultVal}
     */
    public static String getString(String key, String defaultVal) {
        return getSharedPreferences().getString(key, defaultVal);
    }

    /**
     * SP中写入int类型value
     *
     * @param key   键
     * @param value 值
     */
    public static void putInt(String key, int value) {
        SharedPreferences.Editor editor = getEditor();
        editor.putInt(key, value);
        editor.apply();
    }

    /**
     * SP中读取int
     *
     * @param key 键
     * @return 存在返回对应值，不存在返回默认值-1
     */
    public static int getInt(String key) {
        return getInt(key, -1);
    }

    /**
     * SP中读取int
     *
     * @param key        键
     * @param defaultVal 默认值
     * @return 存在返回对应值，不存在返回默认值-1
     */
    public static int getInt(String key, int defaultVal) {
        return getSharedPreferences().getInt(key, defaultVal);
    }

    /**
     * SP中写入long类型value
     *
     * @param key   键
     * @param value 值
     */
    public static void putLong(String key, long value) {
        SharedPreferences.Editor editor = getEditor();
        editor.putLong(key, value);
        editor.apply();
    }

    /**
     * SP中读取long
     *
     * @param key 键
     * @return 存在返回对应值，不存在返回默认值-1
     */
    public static long getLong(String key) {
        return getLong(key, -1);
    }

    /**
     * SP中读取long
     *
     * @param key        键
     * @param defaultVal 默认值
     * @return 存在返回对应值，不存在返回默认值-1
     */
    public static long getLong(String key, long defaultVal) {
        return getSharedPreferences().getLong(key, defaultVal);
    }

    /**
     * SP中写入float类型value
     *
     * @param key   键
     * @param value 值
     */
    public static void putFloat(String key, float value) {
        SharedPreferences.Editor editor = getEditor();
        editor.putFloat(key, value);
        editor.apply();
    }

    /**
     * SP中读取float
     *
     * @param key 键
     * @return 存在返回对应值，不存在返回默认值-1
     */
    public static float getFloat(String key) {
        return getFloat(key, -1F);
    }

    /**
     * SP中读取float
     *
     * @param key        键
     * @param defaultVal 键
     * @return 存在返回对应值，不存在返回默认值-1
     */
    public static float getFloat(String key, float defaultVal) {
        return getSharedPreferences().getFloat(key, defaultVal);
    }

    /**
     * SP中写入boolean类型value
     *
     * @param key   键
     * @param value 值
     */
    public static void putBoolean(String key, boolean value) {
        SharedPreferences.Editor editor = getEditor();
        editor.putBoolean(key, value);
        editor.apply();
    }

    /**
     * SP中读取boolean
     *
     * @param key 键
     * @return 存在返回对应值，不存在返回默认值 false
     */
    public static boolean getBoolean(String key) {
        return getBoolean(key, false);
    }

    /**
     * SP中读取boolean
     *
     * @param key        键
     * @param defaultVal 默认值
     * @return 存在返回对应值，不存在返回默认值{@code defaultVal}
     */
    public static boolean getBoolean(String key, boolean defaultVal) {
        return getSharedPreferences().getBoolean(key, defaultVal);
    }

    public static Set<String> getStringSet(String key) {
        return getStringSet(key, null);
    }

    /**
     * @param key
     * @param defaultVal
     * @return
     */
    public static Set<String> getStringSet(String key, Set<String> defaultVal) {
        return getSharedPreferences().getStringSet(key, defaultVal);
    }

    public static Map<String, ?> getAll() {
        return getSharedPreferences().getAll();
    }

    /**
     * 存放JSON缓存数据
     *
     * @param key   键名
     * @param value 内容
     * @return
     */
    public static void putJSONCache(String key, String value) {
        SharedPreferences sharedPreferences = getSharedPreferences(JSON_CACHE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(key, value);
        editor.apply();
    }

    /**
     * 读取JSON缓存数据
     *
     * @param key 键名
     * @return
     */
    public static String getJSONCache(String key) {
        String cache = getSharedPreferences(JSON_CACHE).getString(key, "");
        return cache;
    }

    /**
     * SP中移除该key
     *
     * @param key 键
     */
    public static void remove(String key) {
        getEditor().remove(key).apply();
    }

    /**
     * 清空数据
     */
    public void clear() {
        SharedPreferences.Editor editor = getEditor();
        editor.clear();
        editor.apply();
    }

    //------------------自定义文件名-------------------------

    /**
     * SP中写入String类型value
     *
     * @param name  preferences文件名
     * @param key   键
     * @param value 值
     */
    public static void putStringFromFile(String name, String key, String value) {
        SharedPreferences.Editor editor = getEditor(name);
        editor.putString(key, value);
        editor.apply();
    }

    /**
     * 从指定SP文件中读取String
     *
     * @param name preferences文件名
     * @param key  键
     * @return 存在返回对应值，不存在返回默认值{@code defaultVal}
     */
    public static String getStringFromFile(String name, String key) {
        return getStringFromFile(name, key, "");
    }

    /**
     * SP中写入String类型value
     *
     * @param name       preferences文件名
     * @param key        键
     * @param defaultVal 默认值
     */
    public static String getStringFromFile(String name, String key, String defaultVal) {
        return getSharedPreferences(name).getString(key, defaultVal);
    }

    /**
     * SP中写入int类型value
     *
     * @param name  preferences文件名
     * @param key   键
     * @param value 值
     */
    public static void putIntFromFile(String name, String key, int value) {
        SharedPreferences.Editor editor = getEditor(name);
        editor.putInt(key, value);
        editor.apply();
    }

    /**
     * SP中读取int
     *
     * @param name preferences文件名
     * @param key  键
     * @return 存在返回对应值，不存在返回默认值-1
     */
    public static int getIntFromFile(String name, String key) {
        return getIntFromFile(name, key, -1);
    }

    /**
     * SP中读取int
     *
     * @param name       preferences文件名
     * @param key        键
     * @param defaultVal 默认值
     * @return 存在返回对应值，不存在返回默认值-1
     */
    public static int getIntFromFile(String name, String key, int defaultVal) {
        return getSharedPreferences(name).getInt(key, defaultVal);
    }

    /**
     * SP中写入long类型value
     *
     * @param name  preferences文件名
     * @param key   键
     * @param value 值
     */
    public static void putLongFromFile(String name, String key, long value) {
        SharedPreferences.Editor editor = getEditor(name);
        editor.putLong(key, value);
        editor.apply();
    }

    /**
     * SP中读取long
     *
     * @param name preferences文件名
     * @param key  键
     * @return 存在返回对应值，不存在返回默认值-1
     */
    public static long getLongFromFile(String name, String key) {
        return getLongFromFile(name, key, -1);
    }

    /**
     * SP中读取long
     *
     * @param name       preferences文件名
     * @param key        键
     * @param defaultVal 默认值
     * @return 存在返回对应值，不存在返回默认值-1
     */
    public static long getLongFromFile(String name, String key, long defaultVal) {
        return getSharedPreferences(name).getLong(key, defaultVal);
    }

    /**
     * SP中写入float类型value
     *
     * @param name  preferences文件名
     * @param key   键
     * @param value 值
     */
    public static void putFloatFromFile(String name, String key, float value) {
        SharedPreferences.Editor editor = getEditor(name);
        editor.putFloat(key, value);
        editor.apply();
    }

    /**
     * SP中读取float
     *
     * @param name preferences文件名
     * @param key  键
     * @return 存在返回对应值，不存在返回默认值-1
     */
    public static float getFloatFromFile(String name, String key) {
        return getFloatFromFile(name, key, -1F);
    }

    /**
     * SP中读取float
     *
     * @param name       preferences文件名
     * @param key        键
     * @param defaultVal 默认值
     * @return 存在返回对应值，不存在返回默认值-1
     */
    public static float getFloatFromFile(String name, String key, float defaultVal) {
        return getSharedPreferences(name).getFloat(key, defaultVal);
    }

    /**
     * SP中写入boolean类型value
     *
     * @param name  preferences文件名
     * @param key   键
     * @param value 值
     */
    public static void putBooleanFromFile(String name, String key, boolean value) {
        SharedPreferences.Editor editor = getEditor(name);
        editor.putBoolean(key, value);
        editor.apply();
    }

    /**
     * SP中读取boolean
     *
     * @param name preferences文件名
     * @param key  键
     * @return 存在返回对应值，不存在返回默认值 false
     */
    public static boolean getBooleanFromFile(String name, String key) {
        return getBooleanFromFile(name, key, false);
    }

    /**
     * SP中读取boolean
     *
     * @param name       preferences文件名
     * @param key        键
     * @param defaultVal 默认值
     * @return 存在返回对应值，不存在返回默认值{@code defaultVal}
     */
    public static boolean getBooleanFromFile(String name, String key, boolean defaultVal) {
        return getSharedPreferences(name).getBoolean(key, defaultVal);
    }

    /**
     * @param name preferences文件名
     * @param key
     * @return
     */
    public static Set<String> getStringSetFromFile(String name, String key) {
        return getStringSetFromFile(name, key, null);
    }

    /**
     * @param name       preferences文件名
     * @param key
     * @param defaultVal 默认值
     * @return
     */
    public static Set<String> getStringSetFromFile(String name, String key, Set<String> defaultVal) {
        return getSharedPreferences(name).getStringSet(key, defaultVal);
    }

    /**
     * @param name preferences文件名
     * @return
     */
    public static Map<String, ?> getAllFromFile(String name) {
        return getSharedPreferences(name).getAll();
    }

    /**
     * 清除指定文件key的信息
     *
     * @param name preferences文件名
     * @param key  删除key的键值
     */
    public static void remove(String name, String key) {
        SharedPreferences.Editor editor = getEditor(name);
        editor.remove(key);
        editor.apply();
    }

    /**
     * 清除指定文件的信息
     *
     * @param name preferences文件名
     */
    public static void clean(String name) {
        SharedPreferences.Editor editor = getEditor(name);
        editor.clear();
        editor.apply();
    }
}
